package session

import (
	"fmt"
	"geeorm/log"
	"geeorm/schema"
	"reflect"
	"strings"
)

//Model方法用于给refTable赋值，解析操作是比较耗时的，因此将解析结果保存在成员变量refTable中，即使Model被调用多次，如果传入的结构体名称不发生变化，则不会更新refTable的值
func (s *Session)Model(value interface{})*Session{
	if s.refTable==nil||reflect.TypeOf(value)!=reflect.TypeOf(s.refTable.Model){
		s.refTable=schema.Prase(value,s.dialect)
	}
	return s
}

//RefTable（）方法返回refTable的值，如果refTable未被赋值，则打印错误日志
func (s *Session)RefTable()*schema.Schema{
	if s.refTable==nil{
		log.Error("Model is not set")
	}
	return s.refTable
}

func (s *Session)CreateTable()error{
	table:=s.RefTable()
	var columns []string
	for _,field:=range table.Fields{
		columns=append(columns,fmt.Sprintf("%s %s %s",field.Name,field.Type,field.Tag))
	}
	desc:=strings.Join(columns,",")
	_,err:=s.Raw(fmt.Sprintf("CREATE TABLE %s (%s);",table.Name,desc)).Exec()
	return err
}

func (s *Session)DropTable()error{
	_,err:=s.Raw(fmt.Sprintf("DROP TABLE IF EXISTS %s", s.RefTable().Name)).Exec()
	return err
}

func (s *Session)HasTable()bool{
	sql,values:=s.dialect.TableExistSQL(s.RefTable().Name)
	row:=s.Raw(sql,values...).QueryRow()
	var tmp string
	_=row.Scan(&tmp)
	return tmp==s.RefTable().Name
}